﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Clarity.Phone.Extensions;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using TradeMeSDK;
using TradeMeSDK.OAuthLibrary;

namespace TradeMo
{
    public partial class App : Application
    {
        public const string GeneralCriteria_Store = "GeneralCriteria_Store";


        /// <summary>
        /// Provides easy access to the root frame of the Phone Application.
        /// </summary>
        /// <returns>The root frame of the Phone Application.</returns>
        public PhoneApplicationFrame RootFrame { get; private set; }

        /// <summary>
        /// Constructor for the Application object.
        /// </summary>
        public App()
        {
            // Trademe Quota system is not working correctly at the moment.  This fixes it.
            TradeMeRepository.BaseUri = TradeMeRepository.BaseSecureUri;

            // Global handler for uncaught exceptions. 
            UnhandledException += Application_UnhandledException;

            // Show graphics profiling information while debugging.
            if (System.Diagnostics.Debugger.IsAttached)
            {
                // Display the current frame rate counters
                Application.Current.Host.Settings.EnableFrameRateCounter = true;

                // Show the areas of the app that are being redrawn in each frame.
                //Application.Current.Host.Settings.EnableRedrawRegions = true;

                // Enable non-production analysis visualization mode, 
                // which shows areas of a page that are being GPU accelerated with a colored overlay.
                //Application.Current.Host.Settings.EnableCacheVisualization = true;
            }

            // Standard Silverlight initialization
            InitializeComponent();

            // Phone-specific initialization
            InitializePhoneApplication();
        }

        // Code to execute when the application is launching (eg, from Start)
        // This code will not execute when the application is reactivated
        private void Application_Launching(object sender, LaunchingEventArgs e)
        {
            if (App.TradeMe.Catalog.IsDownloaded)
                RestoreData();
            RootFrame.Style = Current.Resources["CustomFrame"] as Style;
        }

        // Code to execute when the application is activated (brought to foreground)
        // This code will not execute when the application is first launched
        private void Application_Activated(object sender, ActivatedEventArgs e)
        {
            RestoreData();
            RootFrame.Style = Current.Resources["CustomFrame"] as Style;
        }

        // Code to execute when the application is deactivated (sent to background)
        // This code will not execute when the application is closing
        private void Application_Deactivated(object sender, DeactivatedEventArgs e)
        {
            SaveData();
        }

        // Code to execute when the application is closing (eg, user hit Back)
        // This code will not execute when the application is deactivated
        private void Application_Closing(object sender, ClosingEventArgs e)
        {
            SaveData();
        }

        // Code to execute if a navigation fails
        private void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
        {
            if (System.Diagnostics.Debugger.IsAttached)
            {
                // A navigation has failed; break into the debugger
                System.Diagnostics.Debugger.Break();
            }
        }

        // Code to execute on Unhandled Exceptions
        private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
        {
            if (System.Diagnostics.Debugger.IsAttached)
            {
                // An unhandled exception has occurred; break into the debugger
                System.Diagnostics.Debugger.Break();
            }

        	MessageBox.Show("Bugger: I didn't think you could do that.  Sorry.  Please try again later");
        }

        #region Phone application initialization

        // Avoid double-initialization
        private bool phoneApplicationInitialized = false;

        // Do not add any additional code to this method
        private void InitializePhoneApplication()
        {
            if (phoneApplicationInitialized)
                return;

            // Create the frame but don't set it as RootVisual yet; this allows the splash
            // screen to remain active until the application is ready to render.
            RootFrame = new PhoneApplicationFrame();
            RootFrame.Navigated += CompleteInitializePhoneApplication;

            // Handle navigation failures
            RootFrame.NavigationFailed += RootFrame_NavigationFailed;

            // Ensure we don't initialize again
            phoneApplicationInitialized = true;
        }

        // Do not add any additional code to this method
        private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e)
        {
            // Set the root visual to allow the application to render
            if (RootVisual != RootFrame)
                RootVisual = RootFrame;

            // Remove this handler since it is no longer needed
            RootFrame.Navigated -= CompleteInitializePhoneApplication;

            //TODO: If you wish to access the authenticated APIs you will need to Populate the following
            //TODO: The supplied keys will only work for this sample application
			TradeMeOAuth.ConsumerKey = "1FDA53F5B74EFFB676072B4A11A512CCA2";
			TradeMeOAuth.ConsumerSecret = "11E3F81362B7B887363971BE945E8BF1DE";

            // Set the maximum scope that will be used.  If you only need Read, then remove the other two
            TradeMeOAuth.Scope = TradeMeOAuth.TradeMeScope.Read |
                                 TradeMeOAuth.TradeMeScope.Write |
                                 TradeMeOAuth.TradeMeScope.BiddingAndBuying;

            // Initial to enable UI Thread synchronisation
            TradeMeDispatcher.Initialize();

            //if (!TradeMe.Catalog.IsDownloaded)
            //{
            //    TradeMe.Catalog.Download();
            //}

        }

        #endregion

        public static int ListingCount { get; set; }
        private static bool? _isTrial;
        public static bool IsTrial
        {
            get
            {
                if (!_isTrial.HasValue)
                {
#if DEBUG
                    _isTrial = true;
#else
                    var license = new Microsoft.Phone.Marketplace.LicenseInformation();
                    _isTrial = license.IsTrial();
#endif
                }
                if (_isTrial.HasValue) return _isTrial.Value;
                return true;
            }
        }

        private static TradeMeRepository _tradeMeRepository;
        public static TradeMeRepository TradeMe
        {
            get { return _tradeMeRepository ?? (_tradeMeRepository = new TradeMeRepository()); }
        }

        private static FrameworkElement _rootFrameworkElement;
        public static FrameworkElement RootFrameworkElement
        {
            get { return _rootFrameworkElement ?? (_rootFrameworkElement = Application.Current.RootVisual as FrameworkElement); }
        }

        private static PhoneApplicationPage _page;
        public static PhoneApplicationPage AppPage
        {
            get { return _page ?? (_page = RootFrameworkElement.GetVisualDescendants().OfType<PhoneApplicationPage>().First()); }
        }

        private static MainViewModel _model;
        public static MainViewModel Model
        {
            get { return _model ?? (_model = new MainViewModel()); }
        }

        public static void RestoreData()
        {
            Model.GeneralSearchCriteriaModel.Criteria = 
					new IsolatedStorageRepository<SearchGeneralCriteria>("SearchGeneralCriteria_Store").Get();
        	Model.Recent = new XmlUserDataStore().Restore<RecentViewModel>("Recent_Store");
            Model.Setup = new XmlUserDataStore().Restore<TradeMoSetup>("TradeMoSetup");

            // Silverlight 3 doesn't yet support this
            //Model.Recent = new IsolatedStorageRepository<RecentViewModel>("Recent_Store").Get();
        }

        private static void SaveData()
        {
            new IsolatedStorageRepository<SearchGeneralCriteria>("SearchGeneralCriteria_Store")
					.Write(Model.GeneralSearchCriteriaModel.Criteria);
			new XmlUserDataStore().Backup("Recent_Store", Model.Recent);
            new XmlUserDataStore().Backup("TradeMoSetup", Model.Setup);

            // Silverlight3 does yet support this
            //new IsolatedStorageRepository<RecentViewModel>("Recent_Store").Write(Model.Recent);

        }


    }
}